package pe.edu.sistemas.sisdiho.services;

import java.util.Date;
import java.sql.Time;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import pe.edu.sistemas.sisdiho.entities.Periodo;
import pe.edu.sistemas.sisdiho.entities.Peticion;
import pe.edu.sistemas.sisdiho.entities.RegistroHorario;
import pe.edu.sistemas.sisdiho.repositories.AulaRepository;
import pe.edu.sistemas.sisdiho.repositories.PeriodoRepository;
import pe.edu.sistemas.sisdiho.repositories.PeticionRepository;
import pe.edu.sistemas.sisdiho.repositories.RegistroHorariosRepository;
import pe.edu.sistemas.sisdiho.util.DateUtil;


@Service
@Transactional
public class PeticionService {

	@Autowired
	PeticionRepository peticionRepository;
	@Autowired
	private RecuperacionService recuperacionServ;
	
	@Autowired	
	private RegistroHorariosRepository horarioRepository;
	
	@Autowired
	private PeriodoRepository periodoRepository;
	
	@Autowired
	private AulaRepository aulaRepository;
	
	public void registrarPeticion(Peticion peticion,int idPersona,int tipoEvento){
		peticionRepository.registrarPeticion(peticion,idPersona,tipoEvento);
	}
	
	public void registrarPeticionDir(Peticion peticion,int idPersona,int tipoEvento){
		peticionRepository.registrarPeticionDir(peticion,idPersona,tipoEvento);
	}
	public List<Peticion> obtenerListaPeticionesLabo(){
		List<Peticion> peticionAux=peticionRepository.obtenerPeticionesLabos();
		Iterator<Peticion> iterador=peticionAux.iterator();
		Date hoy = new Date();
		while(iterador.hasNext()){
				Peticion p=(Peticion)iterador.next();
				String nombreU;
				if(p.getSoyUsuario()==1){
					nombreU=p.getNombrePersona();
					p.setNombreUsuario(nombreU);
				}
				if(p.getVisto()==0){
					p.setNombreVisto("NO VISTO");
				}else{
					if(p.getVisto()==1){
						p.setNombreVisto("VISTO");
					}
				}
				if(p.getRespuesta()==-1){
					p.setNombreRespuesta("NO EVALUADO");
				}else{
					if(p.getRespuesta()==0){
						p.setNombreRespuesta("RECHAZADA");
					}else{
						if(p.getRespuesta()==1){
							p.setNombreRespuesta("ACEPTADA");
						}
					}
				}
				Date eventoFinDate = new Date(p.getDia().getYear(), p.getDia().getMonth(), p.getDia().getDate(), p.gethFin().getHours(), p.gethFin().getMinutes());
				Date ultimoEvento = DateUtil.agregarSemanas(eventoFinDate, p.getNumRep()-1);
				if(hoy.after(ultimoEvento)){
					p.setDsblBtnEvaluar(true);
				}
			}
		return peticionAux;
		
	}
	public List<Peticion> obtenerListaPeticionesAula(){
		List<Peticion> peticionAux=peticionRepository.obtenerPeticionesAulas();
		Iterator<Peticion> iterador=peticionAux.iterator();
		Date hoy = new Date();
		while(iterador.hasNext()){
				Peticion p=(Peticion)iterador.next();
				String nombreU;
				if(p.getSoyUsuario()==1){
					nombreU=p.getNombrePersona();
					p.setNombreUsuario(nombreU);
				}
				if(p.getVisto()==0){
					p.setNombreVisto("NO VISTO");
				}else{
					if(p.getVisto()==1){
						p.setNombreVisto("VISTO");
					}
				}
				if(p.getRespuesta()==-1){
					p.setNombreRespuesta("NO EVALUADO");
				}else{
					if(p.getRespuesta()==0){
						p.setNombreRespuesta("RECHAZADA");
					}else{
						if(p.getRespuesta()==1){
							p.setNombreRespuesta("ACEPTADA");
						}
					}
				}
				Date eventoFinDate = new Date(p.getDia().getYear(), p.getDia().getMonth(), p.getDia().getDate(), p.gethFin().getHours(), p.gethFin().getMinutes());
				Date ultimoEvento = DateUtil.agregarSemanas(eventoFinDate, p.getNumRep()-1);
				if(hoy.after(ultimoEvento)){
					p.setDsblBtnEvaluar(true);
				}
			}
		return peticionAux;
		
	}
	public List<Peticion> obtenerListaPeticionesMagna(){
		List<Peticion> peticionAux=peticionRepository.obtenerPeticionesMagna();
		Iterator<Peticion> iterador=peticionAux.iterator();
		Date hoy = new Date();
		while(iterador.hasNext()){
				Peticion p=(Peticion)iterador.next();
				String nombreU;
				if(p.getSoyUsuario()==1){
					nombreU=p.getNombrePersona();
					p.setNombreUsuario(nombreU);
				}
				if(p.getVisto()==0){
					p.setNombreVisto("NO VISTO");
				}else{
					if(p.getVisto()==1){
						p.setNombreVisto("VISTO");
					}
				}
				if(p.getRespuesta()==-1){
					p.setNombreRespuesta("NO EVALUADO");
				}else{
					if(p.getRespuesta()==0){
						p.setNombreRespuesta("RECHAZADA");
					}else{
						if(p.getRespuesta()==1){
							p.setNombreRespuesta("ACEPTADA");
						}
					}
				}
				Date eventoFinDate = new Date(p.getDia().getYear(), p.getDia().getMonth(), p.getDia().getDate(), p.gethFin().getHours(), p.gethFin().getMinutes());
				Date ultimoEvento = DateUtil.agregarSemanas(eventoFinDate, p.getNumRep()-1);
				if(hoy.after(ultimoEvento)){
					p.setDsblBtnEvaluar(true);
				}
			}
		return peticionAux;
		
	}
	public void marcarAceptado(int idPeticion){
		peticionRepository.marcarAceptado(idPeticion);
	}
	public void revertir(int idPeticion){
		peticionRepository.revertir(idPeticion);
	}
	public void marcarVisto(int idPeticion){
		peticionRepository.marcarVisto(idPeticion);
	}
	public void marcarRechazado(int idPeticion){
		peticionRepository.marcarRechazado(idPeticion);
	}
	public List<Peticion> obtenerLabosAprobados(){
		List<Peticion> peticionAux=peticionRepository.obtenerLabosAprobados();
		Iterator<Peticion> iterador=peticionAux.iterator();
		while(iterador.hasNext()){
			Peticion p=(Peticion)iterador.next();
			String nombreU;
			if(p.getSoyUsuario()==1){
				nombreU=p.getNombrePersona();
				p.setNombreUsuario(nombreU);
			}
		}
	return peticionAux;
	}
	public List<Peticion> obtenerAulasAprobadas(){
		
		List<Peticion> peticionAux=peticionRepository.obtenerAulasAprobadas();
		Iterator<Peticion> iterador=peticionAux.iterator();
		while(iterador.hasNext()){
			Peticion p=(Peticion)iterador.next();
			String nombreU;
			if(p.getSoyUsuario()==1){
				nombreU=p.getNombrePersona();
				p.setNombreUsuario(nombreU);
			}
		}
	return peticionAux;
	}
	public List<Peticion> obtenerMagnaAprobadas(){
		List<Peticion> peticionAux=peticionRepository.obtenerMagnaAprobadas();
		Iterator<Peticion> iterador=peticionAux.iterator();
		while(iterador.hasNext()){
			Peticion p=(Peticion)iterador.next();
			String nombreU;
			if(p.getSoyUsuario()==1){
				nombreU=p.getNombrePersona();
				p.setNombreUsuario(nombreU);
			}
		}
	return peticionAux;
	}
	public List<Peticion> obtenerLabosPendientes(){
		List<Peticion> peticionAux=peticionRepository.obtenerLabosPendientes();
		Iterator<Peticion> iterador=peticionAux.iterator();
		while(iterador.hasNext()){
			Peticion p=(Peticion)iterador.next();
			String nombreU;
			if(p.getSoyUsuario()==1){
				nombreU=p.getNombrePersona();
				p.setNombreUsuario(nombreU);
			}
		}
	return peticionAux;
	}
	public List<Peticion> obtenerAulasPendientes(){
		
		List<Peticion> peticionAux=peticionRepository.obtenerAulasPendientes();
		Iterator<Peticion> iterador=peticionAux.iterator();
		while(iterador.hasNext()){
			Peticion p=(Peticion)iterador.next();
			String nombreU;
			if(p.getSoyUsuario()==1){
				nombreU=p.getNombrePersona();
				p.setNombreUsuario(nombreU);
			}
		}
	return peticionAux;
	}
	public List<Peticion> obtenerMagnaPendientes(){
		List<Peticion> peticionAux=peticionRepository.obtenerMagnaPendientes();
		Iterator<Peticion> iterador=peticionAux.iterator();
		while(iterador.hasNext()){
			Peticion p=(Peticion)iterador.next();
			String nombreU;
			if(p.getSoyUsuario()==1){
				nombreU=p.getNombrePersona();
				p.setNombreUsuario(nombreU);
			}
		}
	return peticionAux;
	}
	public List<Peticion> obtenerMisPeticionesLabo(int idPersona){
		List<Peticion> peticionAux=peticionRepository.obtenerMisPeticionesLabo(idPersona);
		Iterator<Peticion> iterador=peticionAux.iterator();
		while(iterador.hasNext()){
				Peticion p=(Peticion)iterador.next();
				String nombreU;
				if(p.getSoyUsuario()==1){
					nombreU=p.getNombrePersona();
					p.setNombreUsuario(nombreU);
				}
				if(p.getVisto()==0){
					p.setNombreVisto("NO VISTO");
				}else{
					if(p.getVisto()==1){
						p.setNombreVisto("VISTO");
					}
				}
				if(p.getRespuesta()==-1){
					p.setNombreRespuesta("NO EVALUADO");
				}else{
					if(p.getRespuesta()==0){
						p.setNombreRespuesta("RECHAZADA");
					}else{
						if(p.getRespuesta()==1){
							p.setNombreRespuesta("ACEPTADA");
						}
					}
				}
			}
		return peticionAux;
		
	}
	public List<Peticion> obtenerMisPeticionesAula(int idPersona){
		List<Peticion> peticionAux=peticionRepository.obtenerMisPeticionesAula(idPersona);
		Iterator<Peticion> iterador=peticionAux.iterator();
		while(iterador.hasNext()){
				Peticion p=(Peticion)iterador.next();
				String nombreU;
				if(p.getSoyUsuario()==1){
					nombreU=p.getNombrePersona();
					p.setNombreUsuario(nombreU);
				}
				if(p.getVisto()==0){
					p.setNombreVisto("NO VISTO");
				}else{
					if(p.getVisto()==1){
						p.setNombreVisto("VISTO");
					}
				}
				if(p.getRespuesta()==-1){
					p.setNombreRespuesta("NO EVALUADO");
				}else{
					if(p.getRespuesta()==0){
						p.setNombreRespuesta("RECHAZADA");
					}else{
						if(p.getRespuesta()==1){
							p.setNombreRespuesta("ACEPTADA");
						}
					}
				}
			}
		return peticionAux;
		
	}
	public List<Peticion> obtenerMisPeticionesMagna(int idPersona){
		List<Peticion> peticionAux=peticionRepository.obtenerMisPeticionesMagna(idPersona);
		Iterator<Peticion> iterador=peticionAux.iterator();
		while(iterador.hasNext()){
				Peticion p=(Peticion)iterador.next();
				String nombreU;
				if(p.getSoyUsuario()==1){
					nombreU=p.getNombrePersona();
					p.setNombreUsuario(nombreU);
				}
				if(p.getVisto()==0){
					p.setNombreVisto("NO VISTO");
				}else{
					if(p.getVisto()==1){
						p.setNombreVisto("VISTO");
					}
				}
				if(p.getRespuesta()==-1){
					p.setNombreRespuesta("NO EVALUADO");
				}else{
					if(p.getRespuesta()==0){
						p.setNombreRespuesta("RECHAZADA");
					}else{
						if(p.getRespuesta()==1){
							p.setNombreRespuesta("ACEPTADA");
						}
					}
				}
			}
		return peticionAux;
		
	}
	public List<Peticion> obtenerListaPosibleCrucePet(int idpet,int idAula,Date hInicio,Date hFin,int dSem){
		return peticionRepository.obtenerListaPosibleCrucePet(idpet,idAula,hInicio,hFin,dSem);
	}
	public List<Peticion> obtenerListaPosibleCrucePetAprob(int idpet,int idAula,Date hInicio,Date hFin,int dSem){
		return peticionRepository.obtenerListaPosibleCrucePetAprob(idpet,idAula,hInicio,hFin,dSem);
	}
	public List<RegistroHorario> obtenerCruceHorarios(Date hInicio,Date hFin,int diaSem,int idAula){
		Periodo p = periodoRepository.obtenerUltimoPeriodo();
		return peticionRepository.obtenerCruceHorarios(p.getNombre(),hInicio,hFin,diaSem,idAula);
		
	}
	public List<Peticion> obtenerListaPosibleCrucePetDir(int idAula,Date hInicio,Date hFin,int dSem){
		return peticionRepository.obtenerListaPosibleCrucePetDir(idAula,hInicio,hFin,dSem);
	}
	public List<Peticion> obtenerListaPosibleCrucePetAprobDir(int idAula,Date hInicio,Date hFin,int dSem){
		return peticionRepository.obtenerListaPosibleCrucePetAprobDir(idAula,hInicio,hFin,dSem);
	}
	public List<RegistroHorario> obtenerCruceHorariosDir(Date hInicio,Date hFin,int diaSem,int idAula){
		Periodo p = periodoRepository.obtenerUltimoPeriodo();
		return peticionRepository.obtenerCruceHorariosDir(p.getNombre(),hInicio,hFin,diaSem,idAula);
		
	}
	public List<String> obtenerIdCEUPS(int idP){
		return peticionRepository.obtenerIdCEUPS(idP);
	}
	public List<String> obtenerIdUPG(int idP){
		return peticionRepository.obtenerIdUPG(idP);
	}
	public String obtenerEmailLabo(){
		return peticionRepository.obtenerEmailLabo();
	}
	public String obtenerEmailAula(){
		return peticionRepository.obtenerEmailAula();
	}
	public String obtenerEmailMagna(){
		return peticionRepository.obtenerEmailMagna();
	}
	public String obtenerNombreUsuario(int idPer){
		return peticionRepository.obtenerNombreUsuario(idPer);
	}
}
